// var pathSum = function (root, targetSum) {
//     let Hash = new Map()
//     Hash.set(0, 1)
//     let curSum = 0

//     function dfs(node) {
//         if (!node) return 0;
//         curSum += node.val
//         let res = Hash.get(curSum - targetSum) || 0
//         Hash.set(curSum, (Hash.get(curSum) || 0) + 1)
//         res += dfs(node.left)
//         res += dfs(node.right)
//         Hash.set(curSum, Hash.get(curSum) - 1)
//         curSum -= node.val
//         return res
//     }
//     return dfs(root)
// };

var pathSum = function (root, targetSum) {
    let hash = new Map();
    hash.set(0, 1);
    let curSum = 0;

    function dfs(node) {
        if (!node) return 0;
        curSum += node.val;
        let res = hash.get(curSum - targetSum) || 0;
        hash.set(curSum, (hash.get(curSum) || 0) + 1);
        res += dfs(node.left);
        res += dfs(node.right);
        hash.set(curSum, hash.get(curSum) - 1);
        curSum -= node.val;
        return res;
    }

    return dfs(root);
}